home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / m7send.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-10  |  2.3 KB  |  155 lines

  1. #include <ctype.h>
  2. #include <string.h>
  3. #include "statetbl.h"
  4. #include "ttyio.h"
  5. #include "lutil.h"
  6.  
  7. static int m7_send(void);
  8.  
  9. static char *fn;
  10.  
  11. int m7send(char*);
  12. int m7send(fname)
  13. char *fname;
  14. {
  15.     fn=fname;
  16.     return m7_send();
  17. }
  18.  
  19. SM_DECL(m7_send,"m7send")
  20. SM_STATES
  21.     waitnak,sendack,sendchar,waitack,sendsub,
  22.     waitcheck,ackcheck
  23. SM_NAMES
  24.     "waitnak","sendack","sendchar","waitack","sendsub",
  25.     "waitcheck","ackcheck"
  26. SM_EDECL
  27.  
  28.     char buf[12],*p;
  29.     int i,c,count=0;
  30.     char cs=SUB;
  31.  
  32.     memset(buf,' ',sizeof(buf));
  33.     for (i=0,p=fn;(i<8) && (*p) && (*p != '.');i++,p++)
  34.         buf[i]=toupper(*p);
  35.     if (*p == '.') p++;
  36.     for (;(i<11) && (*p);i++,p++)
  37.         buf[i]=toupper(*p);
  38.     for (i=0;i<11;i++)
  39.         cs+=buf[i];
  40.     buf[11]='\0';
  41.     debug(11,"modem7 filename \"%s\", checksum %02x",
  42.         buf,(unsigned char)cs);
  43.  
  44. SM_START(sendack)
  45.  
  46. SM_STATE(waitnak)
  47.  
  48.     if (count++ > 6)
  49.     {
  50.         loginf("too many tries sending modem7 name");
  51.         SM_ERROR;
  52.     }
  53.  
  54.     c=GETCHAR(15);
  55.     if (c == TIMEOUT)
  56.     {
  57.         debug(11,"m7 got timeout waiting NAK");
  58.         SM_PROCEED(waitnak);
  59.     }
  60.     else if (c < 0)
  61.     {
  62.         SM_ERROR;
  63.     }
  64.     else if (c == NAK)
  65.     {
  66.         SM_PROCEED(sendack);
  67.     }
  68.     else
  69.     {
  70.         debug(11,"m7 got '%s' waiting NAK",
  71.             printablec(c));
  72.         PUTCHAR('u');
  73.         SM_PROCEED(waitnak);
  74.     }
  75.  
  76.  
  77. SM_STATE(sendack)
  78.  
  79.     i=0;
  80.     PUTCHAR(ACK);
  81.     if (STATUS) {SM_ERROR;}
  82.     else {SM_PROCEED(sendchar)};
  83.  
  84. SM_STATE(sendchar)
  85.  
  86.     if (i > 11) {SM_PROCEED(sendsub);}
  87.  
  88.     PUTCHAR(buf[i++]);
  89.     if (STATUS) {SM_ERROR;}
  90.     else {SM_PROCEED(waitack)};
  91.  
  92. SM_STATE(waitack)
  93.  
  94.     c=GETCHAR(15);
  95.     if (c == TIMEOUT)
  96.     {
  97.         debug(11,"m7 got timeout waiting ACK for char %d",i);
  98.         PUTCHAR('u');
  99.         SM_PROCEED(waitnak);
  100.     }
  101.     else if (c < 0)
  102.     {
  103.         SM_ERROR;
  104.     }
  105.     else if (c == ACK)
  106.     {
  107.         SM_PROCEED(sendchar);
  108.     }
  109.     else
  110.     {
  111.         debug(11,"m7 got '%s' waiting ACK for char %d",
  112.             printablec(c),i);
  113.         PUTCHAR('u');
  114.         SM_PROCEED(waitnak);
  115.     }
  116.  
  117. SM_STATE(sendsub)
  118.  
  119.     PUTCHAR(SUB);
  120.     SM_PROCEED(waitcheck);
  121.  
  122. SM_STATE(waitcheck)
  123.  
  124.     c=GETCHAR(15);
  125.     if (c == TIMEOUT)
  126.     {
  127.         debug(11,"m7 got timeout waiting check");
  128.         PUTCHAR('u');
  129.         SM_PROCEED(waitnak);
  130.     }
  131.     else if (c < 0)
  132.     {
  133.         SM_ERROR;
  134.     }
  135.     else if (c == cs)
  136.     {
  137.         SM_PROCEED(ackcheck);
  138.     }
  139.     else
  140.     {
  141.         debug(11,"m7 got %02x waiting check %02x",
  142.             (unsigned char)c,(unsigned char)cs);
  143.         PUTCHAR('u');
  144.         SM_PROCEED(waitnak);
  145.     }
  146.  
  147. SM_STATE(ackcheck)
  148.  
  149.     PUTCHAR(ACK);
  150.     if (STATUS) {SM_ERROR;}
  151.     else {SM_SUCCESS;}
  152.  
  153. SM_END
  154. SM_RETURN
  155.